package br.com.itc.componentes.listaSelecao{
	
	import br.com.itc.componentes.botoes.Botao;
	import br.com.itc.componentes.containers.CanvasITC;
	import br.com.itc.componentes.dto.SCReqDTO;
	
	import mx.collections.ArrayCollection;
	import mx.controls.List;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.mxml.RemoteObject;
	
	
	public class ListaSelecao extends CanvasITC{
		
		private var _tituloListaSelecao : String = "";
		private var _tituloListaItensSelecionados : String = "";
		private var _labelField : String;
		private var _servicoListagem : RemoteObject;
		private var _metodoListagem : String;
		private var _nomeLista:String = "lista";
		private var _botAdicionarTodos : Botao;
		private var _botAdicionar : Botao;
		private var _botRemover : Botao;
		private var _botRemoverTodos : Botao;
		
		private var _listaSelecao : List;
		private var _listaItensSelecionados : List;
		private var _deveLimparItensSelecionados : Boolean;
		
		public function ListaSelecao() : void{
			
		}
				
		public function listar(criterios : SCReqDTO,deveLimparItensSelecionados:Boolean) : void{
			_deveLimparItensSelecionados = deveLimparItensSelecionados;
			_servicoListagem.getOperation(_metodoListagem).send(criterios);
		}
		
		public function limpar(): void{
			this.limpaListaItensSelecionados();
			this.limpaListaSelecao();
		}
		
		protected function listagemRealizada(evento : ResultEvent) : void{
			habilitarBotoes();
			montaLista(evento.result);
			if(_deveLimparItensSelecionados){
				limpaListaItensSelecionados();
			}else {
				excluirItensJaSelecionados();
			}
			selecionaPrimeiroItem(this.listaSelecao);
		}
		
		protected function excluirItensJaSelecionados() : void{
			var itensListados : ArrayCollection = this.listaSelecao.dataProvider as ArrayCollection;
			for(var i:int = itensListados.length-1; i >= 0 ; i--){
				if(isItemJaSelecionado(itensListados[i])){
					this.removerItemListaSelecao(itensListados[i]);
				}
			}		
		}
		
		protected function isItemJaSelecionado(item:Object):Boolean{
			var itensJaSelecionados : ArrayCollection = this.recuperarItensSelecionados();
			for(var x:int = 0; x < itensJaSelecionados.length; x++){
				var aux : Object = itensJaSelecionados[x];
				if(item[this.listaSelecao.labelField] == aux[this.listaSelecao.labelField]){
					return true;
				}
			}
			return false;
		}
		
		
		protected function montaLista(resultado : Object) : void {
			this.listaSelecao.dataProvider = resultado.dados[this.nomeLista];
		}
		
		private function selecionaPrimeiroItem(lista:List):void{
			if(lista.dataProvider.length > 0){
				lista.selectedItem = lista.dataProvider[0];
			}
		}
		
		public function limpaListaItensSelecionados() : void {
			this.listaItensSelecionados.dataProvider = null;
		}
		
		public function limpaListaSelecao() : void {
			this.listaSelecao.dataProvider = null;
		}
		
		public function recuperarItensSelecionados() : ArrayCollection{
			return ArrayCollection(this.listaItensSelecionados.dataProvider);
		}
		
		public function habilitarBotoes() : void{
			this.botAdicionar.enabled = true;
			this.botAdicionarTodos.enabled = true;
			this.botRemover.enabled = true;
			this.botRemoverTodos.enabled = true;
		}
		
		protected function adicionarItem() : void{
			var item:Object = obterItemSelecionadoListaSelecao();
			if(item){
				this.adicionarItemListaItensSelecionados(item);
				this.removerItemListaSelecao(item);
				this.selecionaPrimeiroItem(this.listaSelecao);
				this.selecionaPrimeiroItem(this.listaItensSelecionados);
			}		
		}
				
		protected function adicionarTodos() : void{
			for(var i:int = this.listaSelecao.dataProvider.length-1; i >= 0 ; i--){
				this.adicionarItemListaItensSelecionados(this.listaSelecao.dataProvider[i]);
				this.removerItemListaSelecao(this.listaSelecao.dataProvider[i]);
				this.selecionaPrimeiroItem(this.listaItensSelecionados);
			}
		}
		
		protected function removerItem() : void{
			var item:Object = obterItemSelecionadoListaItensSelecionados();
			if(item){
				this.adicionarItemListaSelecao(item);
				this.removerItemListaItensSelecionados(item);
				this.selecionaPrimeiroItem(this.listaSelecao);
				this.selecionaPrimeiroItem(this.listaItensSelecionados);
			}
		}
		
		protected function removerTodos() : void{	
			for(var i:int = this.listaItensSelecionados.dataProvider.length-1; i >= 0 ; i--){
				this.adicionarItemListaSelecao(this.listaItensSelecionados.dataProvider[i]);
				this.removerItemListaItensSelecionados(this.listaItensSelecionados.dataProvider[i]);
				this.selecionaPrimeiroItem(this.listaSelecao);
			}
		}
		
		private function adicionarItemListaItensSelecionados(item:Object):void{
			ArrayCollection(this.listaItensSelecionados.dataProvider).addItem(item);
		}
		
		private function adicionarItemListaSelecao(item:Object) : void{
			ArrayCollection(this.listaSelecao.dataProvider).addItem(item);
		}
		
		private function obterItemSelecionadoListaSelecao() : Object {
			return this.listaSelecao.selectedItem;
		}
		
		private function obterItemSelecionadoListaItensSelecionados() : Object {
			return this.listaItensSelecionados.selectedItem;
		}
		
		private function removerItemListaSelecao(item : Object) : void{
			ArrayCollection(this.listaSelecao.dataProvider).removeItemAt(ArrayCollection(this.listaSelecao.dataProvider).getItemIndex(item));
		}
		
		private function removerItemListaItensSelecionados(item : Object) : void{
			ArrayCollection(this.listaItensSelecionados.dataProvider).removeItemAt(ArrayCollection(this.listaItensSelecionados.dataProvider).getItemIndex(item));
		}
		
		public function get metodoListagem() : String{
			return _metodoListagem;
		}
		
		public function set metodoListagem(metodoListagem : String) : void{
			_metodoListagem = metodoListagem;
		}
		
		public function get servicoListagem() : RemoteObject{
			return _servicoListagem;
		}
		
		public function set servicoListagem(servicoListagem : RemoteObject) : void{
			_servicoListagem = servicoListagem;
			
			if(_servicoListagem != null){
				_servicoListagem.addEventListener(ResultEvent.RESULT, listagemRealizada);
			}
		}
		
		[Bindable]
		public function get tituloListaSelecionados() : String{
			return _tituloListaItensSelecionados;
		}
		
		public function set tituloListaSelecionados(titulo : String) : void{
			_tituloListaItensSelecionados = titulo;
		}
		
		public function set tituloListaSelecao(titulo : String):void{
			_tituloListaSelecao = titulo;
		}
		
		[Bindable]
		public function get tituloListaSelecao() : String{
			return _tituloListaSelecao;
		}
		
		[Bindable]
		public function get labelField() : String{
			return _labelField;
		}
		
		public function set labelField(labelField : String) : void{
			_labelField = labelField;
		}
		
		public function get listaItensSelecionados() :List{
			return _listaItensSelecionados;
		}
		
		public function set listaItensSelecionados(listaItensSelecionados : List):void{
			_listaItensSelecionados = listaItensSelecionados;
		}
		
		public function get listaSelecao() : List{
			return _listaSelecao;
		}
		
		public function set listaSelecao(listaSelecao : List) : void{
			_listaSelecao = listaSelecao;
		}
		
		public function set nomeLista(value:String):void {
            _nomeLista = value;
        }
        public function get nomeLista():String {
            return _nomeLista;
        }
        
        public function get botRemoverTodos():Botao {
			return _botRemoverTodos;
		}
		
		public function set botRemoverTodos(botao : Botao): void{
			_botRemoverTodos = botao;
		}
		
		public function get botRemover():Botao {
			return _botRemover;
		}
		
		public function set botRemover(botao : Botao): void{
			_botRemover = botao;
		}
		
		public function set botAdicionarTodos(botao : Botao) : void{
			_botAdicionarTodos = botao;
		}
		
		public function get botAdicionarTodos() : Botao {
			return _botAdicionarTodos;
		}
		
		public function set botAdicionar(botao : Botao) : void{
			_botAdicionar = botao;
		}
		
		public function get botAdicionar() : Botao {
			return _botAdicionar;
		}
	}
}